
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html><head><title>Python: module gummworld2.camera</title>
</head><body bgcolor="#f0f0f8">

<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="heading">
<tr bgcolor="#7799ee">
<td valign=bottom>&nbsp;<br>
<font color="#ffffff" face="helvetica, arial">&nbsp;<br><big><big><strong><a href="gummworld2.html"><font color="#ffffff">gummworld2</font></a>.camera</strong></big></big> (version $Id: camera.py 288 2011-05-01 19:28:58Z stabbingfinger@gmail.com $)</font></td
><td align=right valign=bottom
><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:///C:/cygwin/home/bw/devel/python/svn/gummworld2/gamelib/gummworld2/camera.py">c:\cygwin\home\bw\devel\python\svn\gummworld2\gamelib\gummworld2\camera.py</a></font></td></tr></table>
    <p><tt>camera.py&nbsp;-&nbsp;<a href="#Camera">Camera</a>&nbsp;module&nbsp;for&nbsp;Gummworld2.</tt></p>
<p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#aa55cc">
<td colspan=3 valign=bottom>&nbsp;<br>
<font color="#ffffff" face="helvetica, arial"><big><strong>Modules</strong></big></font></td></tr>
    
<tr><td bgcolor="#aa55cc"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="gummworld2.geometry.html">gummworld2.geometry</a><br>
</td><td width="25%" valign=top><a href="pygame.html">pygame</a><br>
</td><td width="25%" valign=top></td><td width="25%" valign=top></td></tr></table></td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#ee77aa">
<td colspan=3 valign=bottom>&nbsp;<br>
<font color="#ffffff" face="helvetica, arial"><big><strong>Classes</strong></big></font></td></tr>
    
<tr><td bgcolor="#ee77aa"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%"><dl>
<dt><font face="helvetica, arial"><a href="__builtin__.html#object">__builtin__.object</a>
</font></dt><dd>
<dl>
<dt><font face="helvetica, arial"><a href="gummworld2.camera.html#Camera">Camera</a>
</font></dt></dl>
</dd>
</dl>
 <p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#ffc8d8">
<td colspan=3 valign=bottom>&nbsp;<br>
<font color="#000000" face="helvetica, arial"><a name="Camera">class <strong>Camera</strong></a>(<a href="__builtin__.html#object">__builtin__.object</a>)</font></td></tr>
    
<tr bgcolor="#ffc8d8"><td rowspan=2><tt>&nbsp;&nbsp;&nbsp;</tt></td>
<td colspan=2><tt>A&nbsp;<a href="#Camera">Camera</a>&nbsp;provides&nbsp;a&nbsp;few&nbsp;services:<br>
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Track&nbsp;a&nbsp;moving&nbsp;target&nbsp;in&nbsp;world&nbsp;coordinates.<br>
&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Determine&nbsp;the&nbsp;range&nbsp;of&nbsp;visible&nbsp;tiles.<br>
&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Retrieve&nbsp;visible&nbsp;tiles&nbsp;from&nbsp;a&nbsp;Map.<br>
&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Convert&nbsp;coordinates&nbsp;between&nbsp;world&nbsp;and&nbsp;screen&nbsp;space.<br>
&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Interpolated&nbsp;scrolling&nbsp;to&nbsp;take&nbsp;advantage&nbsp;of&nbsp;higher&nbsp;frame&nbsp;rates.<br>
&nbsp;<br>
Dependencies:<br>
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;A&nbsp;target&nbsp;with&nbsp;a&nbsp;Vec2d&nbsp;attribute&nbsp;target.position.<br>
&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;A&nbsp;surface&nbsp;from&nbsp;which&nbsp;to&nbsp;derive&nbsp;its&nbsp;viewing&nbsp;dimensions.<br>
&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;State.clock&nbsp;is&nbsp;needed&nbsp;by&nbsp;<a href="#Camera-interpolate">interpolate</a>().<br>
&nbsp;<br>
To&nbsp;use&nbsp;the&nbsp;camera&nbsp;do&nbsp;the&nbsp;following:<br>
&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;1.&nbsp;&nbsp;In&nbsp;the&nbsp;game's&nbsp;update&nbsp;routine&nbsp;set&nbsp;camera.position&nbsp;to&nbsp;move&nbsp;the&nbsp;target.<br>
&nbsp;&nbsp;&nbsp;&nbsp;2.&nbsp;&nbsp;Also&nbsp;in&nbsp;the&nbsp;game's&nbsp;update&nbsp;routine&nbsp;call&nbsp;<a href="#Camera">Camera</a>.<a href="#Camera-update">update</a>()&nbsp;to&nbsp;update&nbsp;the<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;camera's&nbsp;state.<br>
&nbsp;&nbsp;&nbsp;&nbsp;3.&nbsp;&nbsp;In&nbsp;the&nbsp;game's&nbsp;draw&nbsp;routine&nbsp;call&nbsp;<a href="#Camera">Camera</a>.<a href="#Camera-interpolate">interpolate</a>()&nbsp;to&nbsp;micro-update<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;scrolling&nbsp;between&nbsp;the&nbsp;position&nbsp;prior&nbsp;to&nbsp;step&nbsp;1&nbsp;and&nbsp;final<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;position&nbsp;specified&nbsp;in&nbsp;step&nbsp;1.&nbsp;This&nbsp;may&nbsp;sound&nbsp;complicated,&nbsp;but&nbsp;it&nbsp;is<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;all&nbsp;handled&nbsp;behind&nbsp;the&nbsp;scenes.<br>
&nbsp;<br>
Screen-to-world&nbsp;and&nbsp;world-to-screen&nbsp;conversions&nbsp;are&nbsp;used&nbsp;to&nbsp;convert&nbsp;between<br>
world&nbsp;coordinates&nbsp;and&nbsp;screen&nbsp;coordinates.<br>
&nbsp;<br>
Note&nbsp;that&nbsp;using&nbsp;mouse&nbsp;position&nbsp;can&nbsp;be&nbsp;tricky&nbsp;if&nbsp;the&nbsp;camera&nbsp;is&nbsp;using&nbsp;a<br>
subsurface&nbsp;of&nbsp;the&nbsp;screen,&nbsp;or&nbsp;an&nbsp;alternate&nbsp;surface.&nbsp;pygame&nbsp;always&nbsp;reports<br>
mouse&nbsp;position&nbsp;relative&nbsp;to&nbsp;the&nbsp;top-level&nbsp;surface.&nbsp;Keep&nbsp;this&nbsp;in&nbsp;mind&nbsp;when<br>
positioning&nbsp;graphics&nbsp;based&nbsp;on&nbsp;the&nbsp;mouse&nbsp;position&nbsp;under&nbsp;these&nbsp;circumstances.<br>
Sometimes&nbsp;it&nbsp;may&nbsp;just&nbsp;be&nbsp;simplest,&nbsp;for&nbsp;example,&nbsp;to&nbsp;blit&nbsp;directly&nbsp;to&nbsp;the<br>
top-level&nbsp;surface.<br>
&nbsp;<br>
Property&nbsp;visible_tile_range&nbsp;returns&nbsp;a&nbsp;list&nbsp;of&nbsp;map&nbsp;tile&nbsp;positions&nbsp;[(0,0),<br>
(0,1),&nbsp;...]&nbsp;that&nbsp;are&nbsp;visible&nbsp;on&nbsp;the&nbsp;screen.<br>
&nbsp;<br>
Property&nbsp;visible_tiles&nbsp;returns&nbsp;a&nbsp;list&nbsp;of&nbsp;MapLayer&nbsp;objects&nbsp;that&nbsp;are&nbsp;visible.<br>
&nbsp;<br>
If&nbsp;creating&nbsp;multiple&nbsp;cameras&nbsp;to&nbsp;save&nbsp;and&nbsp;restore&nbsp;in&nbsp;State&nbsp;contexts,&nbsp;by<br>
default&nbsp;the&nbsp;<a href="#Camera-state_restored">state_restored</a>()&nbsp;method&nbsp;updates&nbsp;the&nbsp;new&nbsp;camera&nbsp;from&nbsp;the&nbsp;old.<br>
This&nbsp;solves&nbsp;a&nbsp;split-brain&nbsp;condition&nbsp;that&nbsp;occurs&nbsp;when&nbsp;the&nbsp;cameras'&nbsp;internals<br>
fall&nbsp;out&nbsp;of&nbsp;sync.&nbsp;In&nbsp;some&nbsp;scenarios&nbsp;you&nbsp;may&nbsp;want&nbsp;to&nbsp;have&nbsp;two&nbsp;independent<br>
cameras.&nbsp;To&nbsp;prevent&nbsp;them&nbsp;from&nbsp;syncing&nbsp;during&nbsp;a&nbsp;restore,&nbsp;set&nbsp;the&nbsp;cameras'<br>
update_when_restored=False.<br>&nbsp;</tt></td></tr>
<tr><td>&nbsp;</td>
<td width="100%">Methods defined here:<br>
<dl><dt><a name="Camera-__init__"><strong>__init__</strong></a>(self, target, view<font color="#909090">=None</font>)</dt><dd><tt>Construct&nbsp;an&nbsp;instance&nbsp;of&nbsp;<a href="#Camera">Camera</a>.<br>
&nbsp;<br>
The&nbsp;target&nbsp;argument&nbsp;is&nbsp;the&nbsp;<a href="__builtin__.html#object">object</a>&nbsp;that&nbsp;camera&nbsp;should&nbsp;track.&nbsp;target&nbsp;must<br>
have&nbsp;a&nbsp;position&nbsp;attribute&nbsp;which&nbsp;is&nbsp;its&nbsp;location&nbsp;in&nbsp;world&nbsp;coordinates.<br>
&nbsp;<br>
The&nbsp;view&nbsp;argument&nbsp;is&nbsp;the&nbsp;screen.View&nbsp;<a href="__builtin__.html#object">object</a>&nbsp;upon&nbsp;which&nbsp;to&nbsp;base<br>
conversions&nbsp;between&nbsp;world&nbsp;and&nbsp;screen&nbsp;space.&nbsp;The&nbsp;view.surface&nbsp;attribute<br>
is&nbsp;exposed&nbsp;view&nbsp;the&nbsp;<a href="#Camera">Camera</a>.surface&nbsp;property.</tt></dd></dl>

<dl><dt><a name="Camera-init_position"><strong>init_position</strong></a>(self, pos)</dt><dd><tt>Hard&nbsp;set&nbsp;position&nbsp;to&nbsp;pos.<br>
&nbsp;<br>
This&nbsp;circumvents&nbsp;interpolation,&nbsp;which&nbsp;may&nbsp;be&nbsp;desirable&nbsp;if&nbsp;for&nbsp;example<br>
setting&nbsp;the&nbsp;initial&nbsp;position&nbsp;of&nbsp;the&nbsp;camera,&nbsp;or&nbsp;moving&nbsp;the&nbsp;camera&nbsp;a<br>
great&nbsp;distance&nbsp;when&nbsp;you&nbsp;don't&nbsp;want&nbsp;it&nbsp;to&nbsp;pan.</tt></dd></dl>

<dl><dt><a name="Camera-interpolate"><strong>interpolate</strong></a>(self, *args)</dt><dd><tt>Interpolate&nbsp;camera&nbsp;position&nbsp;towards&nbsp;target&nbsp;for&nbsp;smoother&nbsp;scrolling<br>
&nbsp;<br>
After&nbsp;updating&nbsp;the&nbsp;target&nbsp;position&nbsp;in&nbsp;the&nbsp;main&nbsp;program's&nbsp;<a href="#Camera-update">update</a>(),&nbsp;call<br>
this&nbsp;every&nbsp;frame&nbsp;in&nbsp;the&nbsp;main&nbsp;program's&nbsp;draw()&nbsp;before&nbsp;any&nbsp;drawing<br>
commands.&nbsp;It&nbsp;works&nbsp;best&nbsp;when&nbsp;frame&nbsp;speed&nbsp;is&nbsp;much&nbsp;higher&nbsp;than&nbsp;update<br>
speed.</tt></dd></dl>

<dl><dt><a name="Camera-screen_to_world"><strong>screen_to_world</strong></a>(self, xy)</dt><dd><tt>Convert&nbsp;coordinates&nbsp;from&nbsp;screen&nbsp;space&nbsp;to&nbsp;world&nbsp;space.</tt></dd></dl>

<dl><dt><a name="Camera-slew"><strong>slew</strong></a>(self, vec, dt)</dt><dd><tt>Move&nbsp;<a href="#Camera">Camera</a>.target&nbsp;via&nbsp;pymunk.<br>
&nbsp;<br>
If&nbsp;using&nbsp;pymunk,&nbsp;use&nbsp;this&nbsp;instead&nbsp;of&nbsp;<a href="#Camera">Camera</a>.position.</tt></dd></dl>

<dl><dt><a name="Camera-state_restored"><strong>state_restored</strong></a>(self, prev)</dt><dd><tt>Sync&nbsp;a&nbsp;stale&nbsp;camera&nbsp;after&nbsp;swapping&nbsp;it&nbsp;in.<br>
&nbsp;<br>
If&nbsp;switching&nbsp;states&nbsp;either&nbsp;manually,&nbsp;you&nbsp;may&nbsp;want&nbsp;to&nbsp;call&nbsp;this&nbsp;to<br>
avoid&nbsp;video&nbsp;flashing&nbsp;or&nbsp;whizzing&nbsp;by.&nbsp;This&nbsp;typically&nbsp;happens&nbsp;when&nbsp;using<br>
<a href="#Camera">Camera</a>.<a href="#Camera-interpolate">interpolate</a>()&nbsp;and&nbsp;swapping&nbsp;in&nbsp;the&nbsp;old&nbsp;camera,&nbsp;which&nbsp;has&nbsp;stale<br>
values&nbsp;in&nbsp;the&nbsp;_move_to&nbsp;and&nbsp;_move_from&nbsp;attributes.&nbsp;When&nbsp;swapping&nbsp;a&nbsp;camera<br>
in&nbsp;via&nbsp;State.restore(),&nbsp;this&nbsp;method&nbsp;is&nbsp;called&nbsp;automatically.</tt></dd></dl>

<dl><dt><a name="Camera-update"><strong>update</strong></a>(self, *args)</dt><dd><tt>Update&nbsp;<a href="#Camera">Camera</a>&nbsp;internals&nbsp;to&nbsp;prepare&nbsp;for&nbsp;efficient&nbsp;interpolation.<br>
&nbsp;<br>
Call&nbsp;in&nbsp;the&nbsp;game's&nbsp;update&nbsp;routine&nbsp;after&nbsp;changing&nbsp;<a href="#Camera">Camera</a>.position.</tt></dd></dl>

<dl><dt><a name="Camera-world_to_screen"><strong>world_to_screen</strong></a>(self, xy)</dt><dd><tt>Convert&nbsp;coordinates&nbsp;from&nbsp;world&nbsp;space&nbsp;to&nbsp;screen&nbsp;space.</tt></dd></dl>

<hr>
Data descriptors defined here:<br>
<dl><dt><strong>__dict__</strong></dt>
<dd><tt>dictionary&nbsp;for&nbsp;instance&nbsp;variables&nbsp;(if&nbsp;defined)</tt></dd>
</dl>
<dl><dt><strong>__weakref__</strong></dt>
<dd><tt>list&nbsp;of&nbsp;weak&nbsp;references&nbsp;to&nbsp;the&nbsp;object&nbsp;(if&nbsp;defined)</tt></dd>
</dl>
<dl><dt><strong>abs_offset</strong></dt>
<dd><tt>Offset&nbsp;position&nbsp;camera.subsurface&nbsp;inside&nbsp;its&nbsp;top&nbsp;level&nbsp;parent&nbsp;surface.<br>
&nbsp;<br>
This&nbsp;is&nbsp;equivalent&nbsp;to&nbsp;camera.surface.get_abs_offset().&nbsp;The&nbsp;value&nbsp;is<br>
cached&nbsp;whenever&nbsp;the&nbsp;camera.surface&nbsp;attribute&nbsp;is&nbsp;set.</tt></dd>
</dl>
<dl><dt><strong>abs_screen_center</strong></dt>
<dd><tt>The&nbsp;absolute&nbsp;coordinates&nbsp;of&nbsp;the&nbsp;camera&nbsp;surface's&nbsp;center.<br>
&nbsp;<br>
In&nbsp;general,&nbsp;this&nbsp;is&nbsp;typically&nbsp;useful&nbsp;in&nbsp;mouse-map&nbsp;calculations.<br>
&nbsp;<br>
This&nbsp;is&nbsp;equivalent&nbsp;to&nbsp;camera.surface.get_rect().center&nbsp;+<br>
camera.surface.abs_offset().&nbsp;The&nbsp;value&nbsp;is&nbsp;cached&nbsp;whenever&nbsp;the<br>
camera.surface&nbsp;attribute&nbsp;is&nbsp;set.</tt></dd>
</dl>
<dl><dt><strong>anti_interp</strong></dt>
</dl>
<dl><dt><strong>interp</strong></dt>
<dd><tt>The&nbsp;clock's&nbsp;interpolation&nbsp;value&nbsp;after&nbsp;the&nbsp;last&nbsp;call&nbsp;to<br>
Camera.interpolate.</tt></dd>
</dl>
<dl><dt><strong>position</strong></dt>
<dd><tt>Move&nbsp;Camera.target&nbsp;in&nbsp;world&nbsp;coordinates.</tt></dd>
</dl>
<dl><dt><strong>screen_center</strong></dt>
<dd><tt>The&nbsp;coordinates&nbsp;of&nbsp;the&nbsp;camera&nbsp;surface's&nbsp;center.<br>
&nbsp;<br>
In&nbsp;general,&nbsp;this&nbsp;is&nbsp;typically&nbsp;useful&nbsp;in&nbsp;screen-map&nbsp;calculations.<br>
&nbsp;<br>
This&nbsp;is&nbsp;equivalent&nbsp;to&nbsp;camera.surface.get_rect().center.&nbsp;The&nbsp;value&nbsp;is<br>
cached&nbsp;whenever&nbsp;the&nbsp;camera.surface&nbsp;attribute&nbsp;is&nbsp;set.</tt></dd>
</dl>
<dl><dt><strong>steady_target_position</strong></dt>
<dd><tt>The&nbsp;camera&nbsp;target's&nbsp;position&nbsp;with&nbsp;factored&nbsp;interpolation.<br>
&nbsp;<br>
Use&nbsp;this&nbsp;to&nbsp;get&nbsp;the&nbsp;interpolated&nbsp;position&nbsp;of&nbsp;camera&nbsp;target.&nbsp;Note&nbsp;that<br>
this&nbsp;is&nbsp;different&nbsp;than&nbsp;interpolating&nbsp;a&nbsp;tile&nbsp;or&nbsp;free-roaming&nbsp;sprite,<br>
which&nbsp;scroll&nbsp;in&nbsp;the&nbsp;opposite&nbsp;direction&nbsp;of&nbsp;the&nbsp;camera&nbsp;target.<br>
&nbsp;<br>
Example:<br>
&nbsp;&nbsp;&nbsp;&nbsp;target_rect.center&nbsp;=&nbsp;camera.steady_target_position<br>
&nbsp;&nbsp;&nbsp;&nbsp;screen.blit(target_image,&nbsp;target_rect)<br>
&nbsp;<br>
Think&nbsp;of&nbsp;it&nbsp;as&nbsp;an&nbsp;alternative&nbsp;to&nbsp;hard-coding&nbsp;screen&nbsp;center:<br>
&nbsp;&nbsp;&nbsp;&nbsp;target_rect.center&nbsp;=&nbsp;300,300<br>
&nbsp;&nbsp;&nbsp;&nbsp;screen.blit(target_image,&nbsp;target_rect)</tt></dd>
</dl>
<dl><dt><strong>surface</strong></dt>
<dd><tt>The&nbsp;surface&nbsp;from&nbsp;which&nbsp;to&nbsp;derive&nbsp;the&nbsp;viewing&nbsp;dimensions.</tt></dd>
</dl>
<dl><dt><strong>target</strong></dt>
<dd><tt>The&nbsp;target&nbsp;that&nbsp;camera&nbsp;is&nbsp;tracking.</tt></dd>
</dl>
<dl><dt><strong>view</strong></dt>
<dd><tt>The&nbsp;view&nbsp;from&nbsp;which&nbsp;to&nbsp;derive&nbsp;the&nbsp;surface&nbsp;and&nbsp;viewing&nbsp;dimensions&nbsp;and,<br>
for&nbsp;subsurfaces,&nbsp;the&nbsp;rect&nbsp;for&nbsp;the&nbsp;subsurface&nbsp;in&nbsp;the&nbsp;parent&nbsp;surface.</tt></dd>
</dl>
<dl><dt><strong>visible_tile_range</strong></dt>
<dd><tt>The&nbsp;range&nbsp;of&nbsp;tiles&nbsp;that&nbsp;would&nbsp;be&nbsp;visible&nbsp;on&nbsp;the&nbsp;display&nbsp;surface.&nbsp;The<br>
value&nbsp;is&nbsp;a&nbsp;list&nbsp;of&nbsp;tuples(x1,y1,x2,y2)&nbsp;representing&nbsp;map&nbsp;grid&nbsp;positions<br>
for&nbsp;each&nbsp;layer.&nbsp;The&nbsp;per&nbsp;layer&nbsp;metrics&nbsp;are&nbsp;necessary&nbsp;because&nbsp;maps&nbsp;can<br>
have&nbsp;layers&nbsp;with&nbsp;different&nbsp;tile&nbsp;sizes,&nbsp;and&nbsp;therefore&nbsp;different&nbsp;grids.</tt></dd>
</dl>
<dl><dt><strong>visible_tiles</strong></dt>
<dd><tt>A&nbsp;list&nbsp;of&nbsp;MapLayer&nbsp;objects&nbsp;that&nbsp;would&nbsp;be&nbsp;visible&nbsp;on&nbsp;the&nbsp;display<br>
surface.</tt></dd>
</dl>
</td></tr></table></td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#55aa55">
<td colspan=3 valign=bottom>&nbsp;<br>
<font color="#ffffff" face="helvetica, arial"><big><strong>Data</strong></big></font></td></tr>
    
<tr><td bgcolor="#55aa55"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%"><strong>__author__</strong> = 'Gummbum, (c) 2011'<br>
<strong>__version__</strong> = '$Id: camera.py 288 2011-05-01 19:28:58Z stabbingfinger@gmail.com $'</td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#7799ee">
<td colspan=3 valign=bottom>&nbsp;<br>
<font color="#ffffff" face="helvetica, arial"><big><strong>Author</strong></big></font></td></tr>
    
<tr><td bgcolor="#7799ee"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%">Gummbum,&nbsp;(c)&nbsp;2011</td></tr></table>
</body></html>